# pip install pydantic

from pydantic import BaseModel, Field, ValidationError
from typing import List, Optional

# Определяем модель данных с помощью Pydantic
class Item(BaseModel):
    id: int
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

    class Config:
        orm_mode = True

# Создаем экземпляр модели
item = Item(id=1, name="Sample Item", description="This is a sample item", price=9.99, tax=1.99)

# Печатаем созданный объект
print(item)

# Печатаем объект в виде словаря
print(item.dict())

# Пример валидации данных
try:
    # Данные для валидации
    item_data = {
        "id": 2,
        "name": "Another Item",
        "price": 19.99,
        "tax": "incorrect_type"  # Некорректный тип данных
    }
    # Пытаемся создать объект модели с некорректными данными
    item = Item(**item_data)
except ValidationError as e:
    print("Validation error:", e)

# Пример модели со вложенными моделями
class Order(BaseModel):
    order_id: int
    items: List[Item]
    total: float

# Создаем вложенные модели
item1 = Item(id=3, name="Item 1", price=29.99)
item2 = Item(id=4, name="Item 2", price=39.99, tax=3.99)

# Создаем заказ с вложенными моделями
order = Order(order_id=123, items=[item1, item2], total=69.98)

# Печатаем объект заказа
print(order)

# Пример использования Field для дополнительных параметров
class User(BaseModel):
    id: int
    username: str
    email: str
    age: Optional[int] = Field(None, title="Age of the user", ge=0, le=120)

# Создаем пользователя
user = User(id=1, username="johndoe", email="johndoe@example.com", age=30)

# Печатаем объект пользователя
print(user)

# Пример валидации с некорректным возрастом
try:
    user = User(id=2, username="janedoe", email="janedoe@example.com", age=150)
except ValidationError as e:
    print("Validation error:", e)
